package com.hospital.common.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import cn.hutool.jwt.JWTValidator;

import java.util.Date;
import java.util.Map;

/**
 * JWT工具类
 * @author yhn
 * @version 1.0
 */
public class JwtUtils {
    private static final String SECRET_KEY;
    public static final Integer EXPIRE_MINUTES;
    // 静态初始化
    static{
        SECRET_KEY = PropertiesLoader.load("jwt.properties").getProperty("jwt.secret");
        EXPIRE_MINUTES = Integer.parseInt(PropertiesLoader.load("jwt.properties").getProperty("jwt.expireMinutes"));
    }
    /**
     * 生成 JWT Token
     * @param payload 自定义载荷
     * @return token字符串
     */
    public static String generateToken(Map<String, Object> payload) {
        Date now = new Date();
        Date expireTime = DateUtil.offsetMinute(now,EXPIRE_MINUTES);

        return JWT.create()
                .addPayloads(payload)
                .setIssuedAt(now)
                .setExpiresAt(expireTime)
                .setKey(SECRET_KEY.getBytes())
                .sign();
    }

    /**
     * 校验 JWT Token
     * @param token 待校验的 token
     * @return 负载数据
     */
    public static Map<String, Object> validateToken(String token) {
        JWT jwt = JWTUtil.parseToken(token).setKey(SECRET_KEY.getBytes());

        if (!jwt.verify()) {
            throw new IllegalArgumentException("Token 签名不合法");
        }

        JWTValidator.of(token).validateDate(DateUtil.date());

        return jwt.getPayloads();
    }
}

